﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasDesktop.Classes;


namespace GestorDeFlotasDesktop.AbmRol
{
    public partial class frmAbmUsuario : Form
    {
        public frmAbmUsuario()
        {
            InitializeComponent();
        }
        List<Rol> listaRolesUsuario;
        List<Usuario> listaUsuarios;
        public void inicializarAgregar() {
            SqlInterface.Conectar();
            Roles oRoles = new Roles();

            List<Rol> listaRoles = new List<Rol>();
            List<Rol> listaRolesUsuario = new List<Rol>();
            listaRoles = oRoles.getRolesHabilitados();
            dataGridView1.DataSource = listaRoles;
            SqlInterface.Desconectar();
        }
        private void cargarDgv(string username)
        {
            SqlInterface.Conectar();
            Roles oRoles = new Roles();

            List<Rol> listaRoles = new List<Rol>();
            listaRolesUsuario = new List<Rol>();
            listaRoles = oRoles.getRolesHabilitados();
            listaRolesUsuario = oRoles.getRolesUsuario(username);

            for (int a = 0; a < listaRoles.Count; a++)
            {
                for (int i = 0; i < listaRolesUsuario.Count; i++)
                {
                    if (listaRoles[a].intCodigo == listaRolesUsuario[i].intCodigo)
                    {
                        listaRoles[a].blnAsignado = true;
                        listaRolesUsuario[i].blnAsignado = true;
                        i = listaRolesUsuario.Count;
                    }
                }
            }
            dataGridView1.DataSource = listaRoles;
            SqlInterface.Desconectar();
        }
        public void inicializarModificacion(string username, string password)
        {

            cargarDgv(username);
            txtUsername.Text = username;
            txtPassword.Text = password;
            chkHabilitado.Checked = listaUsuarios[cmbUsers.SelectedIndex].blnHabilitado;
            
        }
        public void cargarUsuarios()
        {
            SqlInterface.Conectar();
            Usuarios oUsuarios = new Usuarios();
            listaUsuarios = oUsuarios.getAllUsuarios();
            cmbUsers.DataSource = listaUsuarios;
            cmbUsers.ValueMember = "strPassword";
            cmbUsers.DisplayMember = "strUsername";
            SqlInterface.Desconectar();
        }
        private void frmAbmUsuario_Load(object sender, EventArgs e)
        {
            
        }
        private bool validarDatosUsuario() {
            if (ValidarHelpers.IsStringPresent(txtUsername.Text, 4, 10) && ValidarHelpers.IsStringPresent(txtPassword.Text))
            {
                
                return true;
            }
            MessageBox.Show("Debe llenar correctamente los campos"); 
            return false;
        }


        private void frmAbmUsuario_FormClosed(object sender, FormClosedEventArgs e)
        {

        }
        public void inicializar(string username)
        {
            cmbUsers.Enabled = false;
            txtUsername.Text = username;
            txtUsername.Enabled = false;
            
            chkHabilitado.Checked = true;
            btnAceptar.Visible = false;
            btnCrear.Visible = false;
            btnCargar.Visible = false;
            btnLimpiar.Visible = false;
            btnOk.Visible = true;
        }
        private void btnModificar_Click(object sender, EventArgs e)
        {
            
            if (validarDatosUsuario())
            {
                SqlInterface.Conectar();
                Usuarios oUsuarios = new Usuarios();
                Usuario oUsuario = new Usuario();
                oUsuario.strUsername = txtUsername.Text;
                oUsuario.strPassword = txtPassword.Text;
                List<Rol> lista = new List<Rol>();
                Rol oRol = new Rol();
                Rol oRolAnt = new Rol();
                for (int a = 0; a < dataGridView1.RowCount; a++)
                {
                    oRol = (Rol)dataGridView1.Rows[a].DataBoundItem;
                    oRolAnt = listaRolesUsuario.Find(Rol => Rol.intCodigo == oRol.intCodigo);
                    if (oRolAnt != null && oRolAnt.blnAsignado != oRol.blnAsignado)
                    {
                        if (oRol.blnAsignado == true)
                        {
                            lista.Add(oRol);
                        }
                        else
                        {
                            if (oUsuarios.deleteRol(oUsuario.strPassword, oRol.intCodigo) < 1)
                            {
                                MessageBox.Show("Error al eliminar rol " + oRol.strNombre + " del usuario.", "ERROR", MessageBoxButtons.OK);
                            }
                        }
                    }
                    else
                    {
                        if (oRolAnt == null && oRol.blnAsignado == true)
                            lista.Add(oRol);
                    }
                }
                oUsuario.blnHabilitado = chkHabilitado.Checked;
                oUsuario.lstRoles = lista;
                if (oUsuarios.update(oUsuario) < 1 || oUsuarios.insertRoles(oUsuario) < 1)
                {
                    MessageBox.Show("Error al modificar usuario.", "ERROR", MessageBoxButtons.OK);
                }
                SqlInterface.Desconectar();
                limpiarCampos();
            }
        }
        private void limpiarCampos()
        {
            txtUsername.Clear();
            txtPassword.Clear();
            inicializarAgregar();
            cargarUsuarios();
            chkHabilitado.Checked = false;
        }
        private void btnBorrar_Click(object sender, EventArgs e)
        {
            Usuarios oUsuarios = new Usuarios();
            SqlInterface.Conectar();
            if (oUsuarios.delete(txtUsername.Text) == 1)
            {
                MessageBox.Show("Se ha borrado al usuario " + txtUsername.Text + " con éxito.");
                limpiarCampos();
            }
            else
            {   
                MessageBox.Show("No se ha podido eliminar al usuario" + txtUsername.Text);

            }
            SqlInterface.Desconectar();
        }
        private void cmbUsers_SelectionChangeCommitted(object sender, EventArgs e)
        {
            
        }

        private void btnCargar_Click(object sender, EventArgs e)
        {
            txtUsername.Enabled = false;
            inicializarModificacion(cmbUsers.Text, cmbUsers.SelectedValue.ToString());
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            inicializarAgregar();
            limpiarCampos();
        }

        private void btnCrear_Click(object sender, EventArgs e)
        {
            if (validarDatosUsuario())
            {
                SqlInterface.Conectar();
                Usuario oUsuario = new Usuario();
                Usuarios oUsuarios = new Usuarios();
                Rol oRol = new Rol();
                oUsuario.strUsername = txtUsername.Text;
                oUsuario.strPassword = txtPassword.Text;
                List<Rol> lista = new List<Rol>();
                for (int a = 0; a < dataGridView1.RowCount; a++)
                {
                    oRol = (Rol)dataGridView1.Rows[a].DataBoundItem;
                    if (oRol.blnAsignado == true)
                    {
                        lista.Add(oRol);
                    }
                }
                oUsuario.lstRoles = lista;
                if (oUsuarios.insertUsuario(oUsuario) != 1)
                {
                    MessageBox.Show("No se pudo crear el usuario", "ERROR", MessageBoxButtons.OK);
                }
                else
                {
                    if (oUsuarios.insertRoles(oUsuario)<1)
                        MessageBox.Show("No se pudo asignar roles", "ERROR",MessageBoxButtons.OK);
                }
                SqlInterface.Desconectar();
                cargarUsuarios();
            }
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            if (validarDatosUsuario())
            {
                SqlInterface.Conectar();
                Usuarios oUsuarios = new Usuarios();
                Usuario oUsuario = new Usuario();
                oUsuario.strUsername = txtUsername.Text;
                oUsuario.strPassword = txtPassword.Text;
                List<Rol> lista = new List<Rol>();
                Rol oRol = new Rol();
                Rol oRolAnt = new Rol();
                for (int a = 0; a < dataGridView1.RowCount; a++)
                {
                    oRol = (Rol)dataGridView1.Rows[a].DataBoundItem;
                    oRolAnt = listaRolesUsuario.Find(Rol => Rol.intCodigo == oRol.intCodigo);
                    if (oRolAnt != null && oRolAnt.blnAsignado != oRol.blnAsignado)
                    {
                        if (oRol.blnAsignado == true)
                        {
                            lista.Add(oRol);
                        }
                        else
                        {
                            if (oUsuarios.deleteRol(oUsuario.strPassword, oRol.intCodigo) < 1)
                            {
                                MessageBox.Show("Error al eliminar rol " + oRol.strNombre + " del usuario.", "ERROR", MessageBoxButtons.OK);
                            }

                        }
                    }
                    else
                    {
                        if (oRolAnt == null && oRol.blnAsignado == true)
                            lista.Add(oRol);
                    }
                }
                oUsuario.blnHabilitado = chkHabilitado.Checked;
                oUsuario.lstRoles = lista;
                if (oUsuarios.update(oUsuario) < 1 || oUsuarios.insertRoles(oUsuario) < 1)
                {
                    MessageBox.Show("Error al modificar usuario.", "ERROR", MessageBoxButtons.OK);
                }
                SqlInterface.Desconectar();
                GestorDeFlotasDesktop.Login.frmLogin frmLogin = new GestorDeFlotasDesktop.Login.frmLogin();
                frmLogin.MdiParent = this.MdiParent;
                frmLogin.Show();
                this.Close();
            }
            
            
        }






        

    }
}
